Add performance counters.
Change keyboard handler keys
Hit 'p' to print performance counters
Hit 'R' to reboot rather than 'r'
Hit 'F1' to toggle keyboard echo
3ddb79bdS39UXxUtZnaScie83-7VTQ xen-2.4.16/common/memory.c
3ddb79bdN51qpRC-6bOH-v5hl_AK6A xen-2.4.16/common/network.c
3ddb79bdD4SLmmdMD7yLW5HcUWucXw xen-2.4.16/common/page_alloc.c
+3e54c38dkHAev597bPr71-hGzTdocg xen-2.4.16/common/perfc.c
3ddb79bdHqdQpATqC0rmUZNbsb6L6A xen-2.4.16/common/resource.c
3e397e6619PgAfBbw2XFbXkewvUWgw xen-2.4.16/common/schedule.c
3ddb79bdB9RNMnkQnUyZ5C9hhMSQQw xen-2.4.16/common/slab.c
3e4540ccaugeWGdOuphJKj6WFw1jkw xen-2.4.16/include/xeno/notifier.h
3ddb79c2Fg44_PBPVxHSC0gTOMq4Ow xen-2.4.16/include/xeno/pci.h
3ddb79c0MOVXq8qZDQRGb6z64_xAwg xen-2.4.16/include/xeno/pci_ids.h
+3e54c38dlSCVdyVM4PKcrSfzLLxWUQ xen-2.4.16/include/xeno/perfc.h
+3e54c38de9SUSYSAwxDf_DwkpAnQFA xen-2.4.16/include/xeno/perfc_defn.h
3ddb79c2byJwwNNkiES__A9H4Cvc4g xen-2.4.16/include/xeno/pkt_sched.h
3ddb79c04nQVR3EYM5L4zxDV_MCo1g xen-2.4.16/include/xeno/prefetch.h
3e4540ccU1sgCx8seIMGlahmMfv7yQ xen-2.4.16/include/xeno/reboot.h
#include <xeno/keyhandler.h>
#include <xeno/reboot.h>
+extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs);
+
#define KEY_MAX 256
#define STR_MAX 64
/* setup own handlers */
add_key_handler('d', dump_registers, "dump registers");
add_key_handler('h', show_handlers, "show this message");
+ add_key_handler('p', perfc_printall, "print performance counters");
add_key_handler('q', do_task_queues, "dump task queues + guest state");
- add_key_handler('r', halt_machine, "reboot machine ungracefully");
+ add_key_handler('R', halt_machine, "reboot machine ungracefully");
return;
}
--- /dev/null
+/*
+ * xen performance counters
+ */
+
+#include <xeno/perfc.h>
+#include <xeno/keyhandler.h>
+
+#define PERFCOUNTER( var, name ) "[0]"name"\0",
+#define PERFCOUNTER_ARRAY( var, name, size ) "["#size"]"name"\0",
+
+char* perfc_name[] = {
+#include <xeno/perfc_defn.h>
+};
+
+struct perfcounter_t perfcounters;
+
+void __perfc_print (unsigned long counter[], int offset)
+{
+ int loop;
+ int total_size = 0;
+ int element_size = 0;
+ int num;
+
+ for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++)
+ {
+ num = sscanf (perfc_name[loop], "[%d]", &element_size);
+ total_size += element_size == 0 ? 1 : element_size;
+ if (total_size > offset) break;
+ }
+ if (loop == sizeof(perfc_name) / sizeof(char *))
+ {
+ printf ("error: couldn't find variable\n");
+ return;
+ }
+ if (element_size == 0) /* single counter */
+ {
+ printf ("%10ld 0x%08lx %s\n", counter[0], counter[0],
+ perfc_name[loop] + 2 + num);
+ }
+ else /* show entire array */
+ {
+ for (loop = 0; loop < element_size; loop++)
+ {
+ printf ("%10ld 0x%08lx %s:%d\n",
+ counter[loop], counter[loop],
+ perfc_name[loop] + 2 + num, loop);
+ }
+ }
+ return;
+}
+
+void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs)
+{
+ int loop, idx;
+ int element_size;
+ int num;
+ unsigned long *counters = (unsigned long *)&perfcounters;
+
+ printf ("xen performance counters\n");
+ for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++)
+ {
+ num = sscanf (perfc_name[loop], "[%d]", &element_size);
+
+ for (idx = 0; idx < (element_size ? element_size : 1); idx++)
+ {
+ if (element_size)
+ {
+ printf ("%10ld 0x%08lx %s:%d\n",
+ *counters, *counters, perfc_name[loop] + num + 2, idx);
+ }
+ else
+ {
+ printf ("%10ld 0x%08lx %s\n",
+ *counters, *counters, perfc_name[loop] + num + 2);
+ }
+ counters++;
+ }
+ }
+
+ return;
+}
#include <hypervisor-ifs/hypervisor-if.h>
#include <asm-i386/io.h>
#include <asm/spinlock.h>
+#include <xeno/perfc.h> /* performance counters */
#include <xeno/keyhandler.h>
blk_request = list_entry(io_done_queue.next, blk_request_t, queue);
list_del (&blk_request->queue);
spin_unlock_irqrestore(&io_done_queue_lock, flags);
+
+ perf_incr(blockio_rx);
/* place on ring for guest os */
blk_ring = blk_request->domain->blk_ring_base;
loop != blk_ring->btx_prod;
loop = BLK_TX_RING_INC(loop)) {
+ perf_incr(blockio_tx);
status = 1;
switch (blk_ring->btx_ring[loop].operation) {
static int keyboard_shift = 0;
static int keyboard_control = 0;
+static int keyboard_echo = 0;
/* the following is pretty gross...
* stop reading if you don't want to throw up!
switch (scancode) {
+ case 0xbb: /* F1 */
+ keyboard_echo = !keyboard_echo;
+ break;
+
case 0xba: /* caps lock UP */
case 0x9d: /* ctrl (left) UP */
keyboard_control = 0;
}
- if (value) printk ("%c", value);
+ if (value && keyboard_echo) printk ("%c", value);
return value;
}
--- /dev/null
+/*
+ * xen performance counters
+ */
+
+/*
+ * NOTE: new counters must be defined in xen_perf_defn.h
+ *
+ * PERFCOUNTER (counter, string) define a new performance counter
+ * PERFCOUNTER_ARRY (counter, string, size) define an array of counters
+ *
+ * unsigned long perfc_value (counter) get value of a counter
+ * unsigned long perfc_valuea (counter, index) get value of an array counter
+ * void perfc_incr (counter) increment a counter
+ * void perfc_incra (counter, index) increment an array counter
+ * void perfc_add (counter, value) add a value to a counter
+ * void perfc_adda (counter, index, value) add a value to array counter
+ * void perfc_print (counter) print out the counter
+ */
+
+#define PERFCOUNTER( var, name ) \
+unsigned long var[1];
+#define PERFCOUNTER_ARRAY( var, name, size ) \
+unsigned long var[size];
+
+struct perfcounter_t
+{
+#include <xeno/perfc_defn.h>
+};
+
+extern struct perfcounter_t perfcounters;
+extern char *perfc_name[];
+
+#define perf_value(x) perfcounters.x[0]
+#define perf_valuea(x,y) perfcounters.x[y]
+#define perf_incr(x) perfcounters.x[0]++
+#define perf_incra(x,y) perfcounters.x[y]++
+#define perf_add(x,y) perfcounters.x[0]+=(y)
+#define perf_adda(x,y,z) perfcounters.x[y]+=(z)
+
+#define perf_print(x) \
+ __perfc_print(perfcounters.x, \
+ &perfcounters.x[0] - ((unsigned long *)&perfcounters))
+
--- /dev/null
+
+PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" )
+PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" )
+